/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package expertos;

import DTOs.DTOCliente;
import entidadesNegocio.Cliente;
import entidadesNegocio.Localidad;
import entidadesNegocio.Zona;
import excepciones.ExpertoClienteExcepcion;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import persistencia.Fachada;

/**
 *
 * @author edu
 */
public class ExpertoABMClientes extends Experto{

    public List<Cliente> buscarClientes (DTOCliente dtocliente) throws ExpertoClienteExcepcion{

        List<Cliente> clientesEncontrados = null;

        if(dtocliente == null){

            clientesEncontrados = Fachada.getInstancia().buscar(Cliente.class, null);
        }else {
            Criteria criterioCliente = Fachada.getInstancia().crearCriterio(Cliente.class);
            if(dtocliente.getNrocliente() != null){
                criterioCliente.add(Restrictions.like("codigoCliente", dtocliente.getNrocliente()));
            }
            if (dtocliente.getNombreCliente() != null){
                criterioCliente.add(Restrictions.like("nombreCliente", "%" + dtocliente.getNombreCliente() + "%").ignoreCase());
            }
            clientesEncontrados = Fachada.getInstancia().buscar(Cliente.class, criterioCliente);
        }
        if (clientesEncontrados.isEmpty()) {
            throw new ExpertoClienteExcepcion("No se encontraron clientes para los datos ingresados");
            
        }

    return clientesEncontrados;
    }


    public List<Localidad> buscarLocalidad(){
        List<Localidad> localidadEncontrada = null;

       localidadEncontrada = Fachada.getInstancia().buscar(Localidad.class, null);

       return localidadEncontrada;

    }

    public List<Zona> buscarZona(){
        List<Zona> zonaEncontrada = null;
        
        zonaEncontrada = Fachada.getInstancia().buscar(Zona.class, null);
        return zonaEncontrada;
    }

    public void guardar(Cliente cliente) throws ExpertoClienteExcepcion{
        if (clienteInvalido(cliente)) {
            throw new ExpertoClienteExcepcion("Faltan completar Campos");
        }else{
        
        try {
            Fachada.getInstancia().guardar(cliente);
        } catch (Exception ex) {
            throw new ExpertoClienteExcepcion("Error al guardar el Cliente");
        }
        }
    }



    public void eliminar(Cliente cliente) throws ExpertoClienteExcepcion{
        cliente.setEliminado(true);
        
        try {
            Fachada.getInstancia().guardar(cliente);
            
        } catch (Exception ex) {
            throw  new ExpertoClienteExcepcion("Error al eliminar el Cliente");
        }
        

    }

    public void guardar(Zona nuevaZona) throws ExpertoClienteExcepcion{

        if (zonaInvalida(nuevaZona)) {
            throw new ExpertoClienteExcepcion("Falta completar Campos");
        }
        try{
        Fachada.getInstancia().guardar(nuevaZona);
        } catch (Exception ex){
            throw new ExpertoClienteExcepcion("Error al guardar la Zona");
        }
    }

    public void guardarLocalidad(Localidad nuevaLocalidad)throws ExpertoClienteExcepcion{
        if(localidadInvalida(nuevaLocalidad)){
            throw new ExpertoClienteExcepcion("Falta completar Campos");
        }
        try{
        Fachada.getInstancia().guardar(nuevaLocalidad);
        } catch (Exception ex){
            throw new ExpertoClienteExcepcion("Error al guardar la Localidad");
        }
    }

    private boolean clienteInvalido(Cliente cliente) {
        if (cliente.getCodigoCliente().length() == 0) {
            return true;
        }else if(cliente.getNombreCliente().length() == 0){
            return true;
        }else if(cliente.getDireccionCliente().length()==0){
            return true;
        }else if(cliente.getLocalidad().getNombreLocalidad().length() == 0){
            return true;
        }else {
            return false;
        }
        
    }

    private boolean zonaInvalida(Zona nuevaZona){
        if(nuevaZona.getCodigozona().length() == 0){
            return true;
        }else if(nuevaZona.getNombrezona().length() == 0){
            return true;
        }else{
            return false;
        }
    }

    private boolean localidadInvalida(Localidad nuevaLocalidad){
        if(nuevaLocalidad.getCodigoLocalidad().length() == 0){
            return true;
        }else if(nuevaLocalidad.getNombreLocalidad().length() == 0){
            return true;
        }else if(nuevaLocalidad.getProvincia().length() == 0) {
            return true;
        }else if(nuevaLocalidad.getZona().getNombrezona().isEmpty()){
            return true;
        }else{
            return false;
        }
    }
}
